(*DONT_TOUCH = "TRUE"*)
module top_uart_packet(
    input               sys_clk ,    //系统输入时钟 100M
    input               sys_rst_n ,    //系统复位，低电平有效

    input       [15:0]  count,      //计数个数，32位降到16位

    input               uart_rxd  ,    //串口接收的数据
    output              uart_txd  ,    //串口发送的数据

    output               fun0_en,      //功能0使能信号
    output               fun1_en,      //功能1使能信号
    output               fun2_en,      //功能2使能信号
    output               fun3_en,      //功能3使能信号
    output               fun4_en,       //功能4使能信号
    output      [15:0]   fun_parmeter  //功能参数

);

//parameter define
parameter PACKET_HEAD    = 8'h55;    //定义数据包头

parameter FUN0           = 8'h00;    //功能0
parameter FUN1           = 8'h01;    //功能1
parameter FUN2           = 8'h02;    //功能2
parameter FUN3           = 8'h03;    //功能3
parameter FUN4           = 8'h04;    //功能4

parameter ERR_HEAD       = 8'hE0;    //包头检测错误
parameter ERR_CMD        = 8'hE1;    //发送无效命令报错
parameter ERR_DATA_LEN   = 8'hE2;    //有效数据长度发送错误
parameter ERR_CHECKSUM   = 8'hE3;    //校验错误

parameter PARSE_OK       = 8'h00;    //数据包解析正确

//wire define
wire    [7:0]    uart_rx_data   ;    //UART接收端接收的数据
wire             uart_rx_done   ;    //UART接收一字节数据完成标志
//wire    [15:0]   fun_parmeter   ;    
wire             parse_done     ;    //解包完成标志
wire    [7:0]    parse_result   ;    //解包后的结果,8'h00:解析正确 8'hEx:解析错误
wire    [7:0]    parse_cmd      ;    //命令 00：fun0 01：fun1 02：fun2 03：fun3 04:fun4 5个功能
wire             uart_tx_en     ;    //UART发送端使能信号
wire    [7:0]    uart_tx_data   ;    //UART发送端的数据
wire             uart_tx_busy   ;    //UART发送端忙率标志信号
wire             packet_tx_done ;    //一包数据全部发送完成标志
//*****************************************************
//**                   main code
//*****************************************************

//例化串口通信接收模块uart_rx
uart_rx    u_uart_rx(
    .clk                 (sys_clk       ),
    .rst_n               (sys_rst_n     ),
    .uart_rxd            (uart_rxd      ),
    .uart_rx_done        (uart_rx_done  ),
    .uart_rx_data        (uart_rx_data  ) 
);

//例化数据包解析模块
packet_decode #(
    .PACKET_HEAD         (PACKET_HEAD   ),
    .FUN0                (FUN0),
    .FUN1                (FUN1),
    .FUN2                (FUN2),
    .FUN3                (FUN3),
    .FUN4                (FUN4),
    .ERR_HEAD            (ERR_HEAD      ),
    .ERR_CMD             (ERR_CMD       ),
    .ERR_DATA_LEN        (ERR_DATA_LEN  ),
    .ERR_CHECKSUM        (ERR_CHECKSUM  ),
    .PARSE_OK            (PARSE_OK      ))
    u_packet_decode(
    .clk                 (sys_clk       ),
    .rst_n               (sys_rst_n     ),
    .uart_rx_data        (uart_rx_data  ),
    .uart_rx_done        (uart_rx_done  ),
    .packet_tx_done      (packet_tx_done),
    
    .fun0_en             (fun0_en       ),
    .fun1_en             (fun1_en       ),
    .fun2_en             (fun2_en       ),
    .fun3_en             (fun3_en       ),
    .fun4_en             (fun4_en       ),
    .fun_parmeter        (fun_parmeter  ),

    .parse_done          (parse_done    ),
    .parse_result        (parse_result  ),
    .parse_cmd           (parse_cmd     )
);


//例化数据包打包模块
packet_code #(
    .PACKET_HEAD         (PACKET_HEAD   ),
    .PARSE_OK            (PARSE_OK      ))
    u_packet_code(
    .clk                 (sys_clk       ),
    .rst_n               (sys_rst_n     ),
    .fun_parmeter        (count  ),
    .uart_tx_busy        (uart_tx_busy  ),
    .parse_done          (parse_done    ),
    .parse_result        (parse_result  ),
    .parse_cmd           (parse_cmd     ),
    .packet_tx_done      (packet_tx_done),
    .uart_tx_en          (uart_tx_en    ),
    .uart_tx_data        (uart_tx_data  )
);

//例化串口通信发送模块uart_tx
uart_tx    u_uart_tx(
    .clk                (sys_clk        ),
    .rst_n              (sys_rst_n      ),
    .uart_tx_data       (uart_tx_data   ),
    .uart_tx_en         (uart_tx_en     ),
    .uart_tx_busy       (uart_tx_busy   ),
    .uart_txd           (uart_txd       )
);

endmodule